home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 07 - 1991 / 07.06 Jun 91 / SearchVol Src / SearchVol.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-04-07  |  4.4 KB  |  229 lines  |  [TEXT/KAHL]

  1. #include "HyperXCmd.h"
  2. #include "FileMgr.h"
  3. #include "HFS.h"
  4. #include "ResourceMgr.h"
  5. #include "SetUpA4.h"
  6.  
  7.  
  8.  
  9.  
  10. #define False            0
  11. #define True            !False
  12. #define Nil                0L
  13.  
  14.  
  15.  
  16.  
  17. /*------------------------------------------------------------------------
  18.  
  19. ------------------------------------------------------------------------*/
  20. pascal main(paramPtr)
  21.    XCmdBlockPtr    paramPtr;
  22.    {
  23.    Str255                fName,str,fullPath,vName;
  24.    HParamBlockRec        MyHPB;
  25.    CInfoPBRec            MyCIPB;
  26.    OSErr                    fErr;
  27.    short                    theVol;
  28.    Handle                nameH;
  29.    long                    theDir,foundDir;
  30.    
  31.    RememberA0();
  32.    SetUpA4();
  33.    
  34.    if ((paramPtr->paramCount < 1) || (paramPtr->paramCount > 2)) 
  35.        {
  36.        SysBeep(10);
  37.        /* return error string */
  38.        goto Done;
  39.        }
  40.    
  41.    ZeroToPas(paramPtr,*((unsigned char **)paramPtr->params[0]),fName);
  42.    if (paramPtr->paramCount == 2)
  43.        {
  44.        ZeroToPas(paramPtr,*((unsigned char **)paramPtr->params[1]),vName);
  45.        if (vName[vName[0]] != ':')
  46.            {
  47.            vName[0]++;
  48.            vName[vName[0]] = ':';
  49.            }
  50.         MyHPB.volumeParam.ioCompletion     = Nil;
  51.         MyHPB.volumeParam.ioNamePtr         = vName;
  52.         MyHPB.volumeParam.ioVRefNum         = 0;
  53.         MyHPB.volumeParam.ioVolIndex         = -1;
  54.         fErr = PBHGetVInfo(&MyHPB,False);
  55.         if (fErr)
  56.             {
  57.            SysBeep(10);
  58.            /* return error string */
  59.            goto Done;
  60.             }
  61.         theVol = MyHPB.volumeParam.ioVRefNum;
  62.         }
  63.    else theVol = GetSysVol();
  64.    
  65.    MyCIPB.dirInfo.ioCompletion = 0L;
  66.    MyCIPB.dirInfo.ioNamePtr = 0L;
  67.    MyCIPB.dirInfo.ioVRefNum = theVol;
  68.    MyCIPB.dirInfo.ioFDirIndex = 0;
  69.    MyCIPB.dirInfo.ioDrDirID = 2L;
  70.    fErr = PBGetCatInfo(&MyCIPB,False);
  71.    
  72.    if (fErr)
  73.         {
  74.        SysBeep(10);
  75.        /* return error string */
  76.        goto Done;
  77.         }
  78.     else
  79.        {
  80.        fErr = SearchFile(2L,MyCIPB.dirInfo.ioDrNmFls,theVol,&fName,&foundDir);
  81.        if (fErr)
  82.             {
  83.            SysBeep(10);
  84.            /* return error string */
  85.            goto Done;
  86.             }
  87.         
  88.        fullPath[0] = 0;
  89.        PstrCopy(fullPath,fName);
  90.        
  91.        MyCIPB.dirInfo.ioCompletion = Nil;
  92.        MyCIPB.dirInfo.ioNamePtr = str;
  93.        MyCIPB.dirInfo.ioVRefNum = theVol;
  94.        MyCIPB.dirInfo.ioFDirIndex = -1;
  95.        MyCIPB.dirInfo.ioDrDirID = foundDir;
  96.        fErr = PBGetCatInfo(&MyCIPB,False);
  97.        PrependStr(MyCIPB.dirInfo.ioNamePtr,fullPath);
  98.        
  99.        do {
  100.            MyCIPB.dirInfo.ioDrDirID = MyCIPB.dirInfo.ioDrParID;
  101.            fErr = PBGetCatInfo(&MyCIPB,False);
  102.            if (fErr == noErr) PrependStr(MyCIPB.dirInfo.ioNamePtr,fullPath);
  103.            } while (fErr == noErr);
  104.        
  105.        paramPtr->returnValue = PasToZero(paramPtr,(StringPtr)fullPath);
  106.        }
  107.  
  108. Done:
  109.    RestoreA4();
  110.    }
  111.   
  112.  
  113.  
  114.  
  115. SearchFile(theDir,count,theVol,fName,foundDir)
  116.     long                theDir;
  117.    short                count,theVol;
  118.    Str255            *fName;
  119.    long                *foundDir;
  120.    {
  121.    short                I;
  122.    OSErr                fErr;
  123.    Str255            str;
  124.    CInfoPBPtr        MyCIPB;
  125.    
  126.    MyCIPB = (CInfoPBPtr)NewPtr(sizeof(CInfoPBRec));
  127.    for (I=1;I<=count;I++)
  128.        {
  129.        str[0] = 0;
  130.        MyCIPB->dirInfo.ioCompletion = Nil;
  131.        MyCIPB->dirInfo.ioNamePtr = str;
  132.        MyCIPB->dirInfo.ioVRefNum = theVol;
  133.        MyCIPB->dirInfo.ioFDirIndex = I;
  134.        MyCIPB->dirInfo.ioDrDirID = theDir;
  135.        fErr = PBGetCatInfo(MyCIPB,False);
  136.        if (fErr) 
  137.            {
  138.            SysBeep(10);
  139.            return (fErr);
  140.            }
  141.        else
  142.            {
  143.            if (!(MyCIPB->dirInfo.ioFlAttrib & 0x10))
  144.                {
  145.                if (EqualString(fName,MyCIPB->dirInfo.ioNamePtr,False,True))
  146.                    {
  147.                    *foundDir = MyCIPB->hFileInfo.ioFlParID;
  148.                    return (0);
  149.                    }
  150.                }
  151.            }
  152.        }
  153.    
  154.    for (I=1;I<=count;I++)
  155.        {
  156.        str[0] = 0;
  157.        MyCIPB->dirInfo.ioCompletion = Nil;
  158.        MyCIPB->dirInfo.ioNamePtr = str;
  159.        MyCIPB->dirInfo.ioVRefNum = theVol;
  160.        MyCIPB->dirInfo.ioFDirIndex = I;
  161.        MyCIPB->dirInfo.ioDrDirID = theDir;
  162.        fErr = PBGetCatInfo(MyCIPB,False);
  163.        if (fErr) 
  164.            {
  165.            SysBeep(10);
  166.            return (fErr);
  167.            }
  168.        else
  169.            {
  170.            if (MyCIPB->dirInfo.ioFlAttrib & 0x10)
  171.                {
  172.                fErr = SearchFile(MyCIPB->dirInfo.ioDrDirID,
  173.                                        MyCIPB->dirInfo.ioDrNmFls,
  174.                                        theVol,
  175.                                        fName,
  176.                                        foundDir);
  177.                if (!fErr) return (0);
  178.                }
  179.            }
  180.        }
  181.    
  182.    DisposPtr(MyCIPB);
  183.    return (fnfErr);
  184.    }
  185.  
  186.  
  187.  
  188.  
  189. PrependStr(s1,s2)
  190.     char                *s1,*s2;
  191.     {
  192.     Str255            temp;
  193.  
  194.     PstrCopy(temp,s2);
  195.     s1[0]++;
  196.     s1[s1[0]] = ':';
  197.     PstrCopy(s2,s1);
  198.     BlockMove(&(temp[1]),&(s2[s2[0]+1]),(long)temp[0]);
  199.     s2[0] += temp[0];
  200.     }
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207. PstrCopy(s1,s2)
  208.     char            *s1,*s2;
  209.     {
  210.     short            len;
  211.     
  212.     for (len=*s2;len>=0;--len) *s1++ = *s2++;
  213.     }
  214.  
  215.  
  216.  
  217.  
  218.  
  219. GetSysVol()
  220.    {
  221.    short    vRefNum;
  222.    OSErr    FErr;
  223.    
  224.    FErr = GetVRefNum(SysMap,&vRefNum);
  225.    return vRefNum;
  226.    }
  227.    
  228.  
  229.